<?php


//------------------   校验码 start   --------------------//

// 调用随机数
// function test(){
// 	$string = rand_character('我是一个大号儿的好热啊');
// 	draw_validate_code($string, 'msyhbd.ttf');
// }

	
/**
 * 获取随机字符.如果传入了自定义字符串,第三个参数将失效
 * @param  string  $text   自定义字符串
 * @param  integer $length 随机字符串长度
 * @param  integer $type   随机类型,位移枚举
 * @return string,bool     如果失败就返回false,成功就返回字符串
 */
function  rand_character($text = '', $length = 4, $type = 7){

    if ($str = $text) {
    	$str  = mb_str_split($str);
        $type = 0;
    }

	if ($type & 1){
		$str .= '0123456789';
	}
	if ($type & 2){
		$str .= 'abcdefghijklmnopqrstuvwxyz';
	}
	if ($type & 4){
		$str .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
	}
	
	if ($type == 0) {
		$range = count($str);
	} else {
		$range = strlen($str);
	}

	if ($range < 1){
		return false;
	}
	
	$range--;
	$loop = 0;
	$randChars = '';
	while(++$loop <= $length){
		$randChars .= $str[mt_rand(0, $range)];
	}
	
	return $randChars;
}

/**
 * 绘制校验码,如果传入文件名就生成图片,否则直接以文件流的方式输出
 * @param  string  $text       生成的字符    
 * @param  [type]  $fontFamily 字体名称
 * @param  string  $newName    新文件名称
 * @param  float   $fontSize   字体大小
 * @param  integer $width      校验码宽度
 * @param  integer $height     校验码高度
 * @return [type]              没有返回值,
 */
function draw_validate_code($text, $fontFamily = '', $newName = '', $fontSize = 24.0, $width = 150, $height = 50){
	// create image
	$img = imageCreate($width, $height);
	
	// light background
	imageFill($img, 0, 0, rand_color($img, false));
	imageRectangle($img, 0, 0, $width-1, $height-1, imageColorAllocate($img, 0, 0, 0));
	
	// draw text
	$strArr = mb_str_split($text);
	$count  = count($strArr);
	$spaceX = $width / $count;
	$spaceY = ($height - $fontSize) / 2 + $fontSize;

	if (empty($fontFamily))
	{
		var_dump($font);
		for($i = 0; $i < $count; $i++){
			imagechar($img, 5, $spaceX*$i+5, $spaceY, $strArr[$i], rand_color($img, true));
		}
	}
	else
	{
		for($i = 0; $i < $count; $i++){
			imagettftext($img, $fontSize, mt_rand(-15, 15), $spaceX*$i+5, $spaceY,
			    rand_color($img, true), $fontFamily, $strArr[$i]);
		}
	}
	
	// draw intruder
	draw_intruder($img, $width, $height);
	
	// save pic
	if (!empty($newName) && is_string($newName))
	{
		imagePNG($img, $newName);
	}
	else
	{
		header('Content-type:image/png');
		imagePNG($img);
	}
	
	// destroy
	imageDestroy($img);
}

/**
 * 绘制噪点
 * @param  [type]  &$img   图片资源类型
 * @param  [type]  $width  图片高度
 * @param  [type]  $height 图片宽度
 * @param  integer $point  噪点数量
 * @param  integer $line   线的数量
 * @param  integer $arc    弧度的数量
 * @return [type]          null
 */
function draw_intruder(&$img, $width, $height, $point = 50, $line = 10, $arc = 5){
	
	for ($i = 0; $i < $point; $i++){
		imagesetpixel($img, mt_rand(0, $width), mt_rand(0, $height), rand_color($img, true));
	}
	
	for ($i = 0; $i < $line; $i++){
		imageLine($img, mt_rand(0, $width), mt_rand(0, $height),mt_rand(0, $width), mt_rand(0, $height),
		   rand_color($img, true));
	}
	
	for ($i = 0; $i < $arc; $i++){
		imageARC($img, mt_rand(0, $width), mt_rand(0, $height), mt_rand(0, $width), mt_rand(0, $height),
		    mt_rand(0, 360), mt_rand(0, 360), rand_color($img, true));
	}
}

/**
 * 随机颜色,深度与浅颜色
 * @param  [type]  &$img    图片资源类型
 * @param  boolean $is_dark 是否是深色
 * @param  integer $limit   分界线,越大颜色越浅
 * @return [type]           颜色
 */
function rand_color(&$img, $is_dark = false, $limit = 130){
	if ($is_dark)
	{
		return imageColorAllocate($img, mt_rand(0, $limit), mt_rand(0, $limit), mt_rand(0, $limit));
	}
	else
	{
		return imageColorAllocate($img, mt_rand($limit, 255), mt_rand($limit, 255), mt_rand($limit, 255));
	}
}

/**
 * 手册中找的,能切割汉字
 * @param  [type] $string [description]
 * @return [type]         [description]
 */
function mb_str_split( $string ) { 
    # Split at all position not after the start: ^ 
    # and not before the end: $ 
    return preg_split('/(?<!^)(?!$)/u', $string ); 
}

//------------------   校验码 END   ------------------------//

